home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-09-22 | 74.1 KB | 1,906 lines |
-
-
- TOY Prolog ST
-
- Dokumentation für Version 3
-
- Inhalt
-
- I. Urheberrechte
- II. Syntax und Benutzerschnittstelle
- III. Systemfunktionen und vordefinierte Prädikate
- IV. Die Hilfsprogramme
- V. Die Demonstrationsprogramme
-
- Anhang
-
- A.1 Aufbau des Interpreters
- A.2 Syntax des inneren Interpreters
- A.3 Die Systemdatei
- A.4 Die Implementierung der Benutzerschnittstelle
- A.5 Unterschiede der vorliegenden Version zur Dokumentation
-
- I. Urheberrechte
-
- Das Programm basiert auf einer Implementierung von Prolog, die von
- Feliks Kluzniak und Stanislaw Szpakowicz in ihrem Buch "Prolog for
- Programmers" (Academic Press, London, 1985) veröffentlicht wurde.
-
- Die Rechte für die ATARI-Version liegen bei Jens Kilian, Bensheim.
-
-
- Das Programm ist unter der Bedingung, daß keiner der Hinweise auf
- die bestehenden Urheberrechte aus den verschiedenen Dateien
- entfernt oder verändert wird, freigegeben zur öffentlichen
- Verbreitung, jedoch darf es nicht gewinnbringend verkauft werden.
-
-
-
- ATARI, 520 ST und TOS sind Warenzeichen der ATARI Corp.
-
- GEM ist Warenzeichen von Digital Research, Inc.
-
-
- II. Syntax und Benutzerschnittstelle
-
- Der verwendete Dialekt ähnelt stark dem in "Programming in Prolog"
- (Clocksin/Mellish, Springer-Verlag, Berlin und Heidelberg 1981)
- verwendeten Dialekt Prolog-10. Einige der Unterschiede werden
- weiter unten mit angegeben.
-
-
-
- II.1 Syntax von TOY Prolog
-
- Die verwendete Notation ist BNF, wobei die nicht-terminalen
- Symbole fett dargestellt sind; einige davon sind mit Indizes
- versehen. Der Konstrukt { s } bedeutet, daß die Symbolfolge s
- beliebig oft (auch 0 mal) wiederholt werden kann.
- Um Verwechselungen vorzubeugen, sind die terminalen Symbole {, |,
- } ebenfalls fett dargestellt.
-
- Es wird angenommen, daß die normalen Operatorvereinbarungen in
- Kraft sind.
-
- Kommentare sind durch *** angegeben.
-
- Klausel ::= Definition | Grammatische_Regel | Direktive
- Definition ::= Regel | Fakt
- Regel ::= Kopf :- Rumpf
- Fakt ::= Kopf
- *** Der äußerste Funktor von Kopf ist nicht :- / 2
- Kopf ::= Funktor_Term
- Rumpf ::= Rumpf_Alternative { ; Rumpf_Alternative }
- Rumpf_Alternative ::= Aufruf { , Aufruf }
- Aufruf ::= Funktor_Term | Variable | ( Rumpf )
- Funktor_Term ::= Term
- *** Keine Variable und kein Integer; eine formale Definition
- *** wäre ziemlich aufwendig
- Grammatische_Regel ::= Linke_Seite --> Rechte_Seite
- Linke_Seite ::= Nicht_terminal Kontext | Nicht_terminal
- Nicht_terminal ::= Funktor_Term
- Kontext ::= terminale_Symbole
- Rechte_Seite ::= Alternativen
- Alternativen ::= Alternative { ; Alternative }
- Alternative ::= Regel_Element { , Regel_Element }
- Regel_Element ::= Nicht_terminal | terminale_Symbole |
- Bedingung | ! | ( Alternativen )
- terminale_Symbole ::= Liste | Zeichenkette
- *** Nur 'geschlossene' Listen sind erlaubt
- Bedingung ::= Klammer_Term
- Direktive ::= Kommando | Anfrage
- Kommando ::= :- Rumpf
- Anfrage ::= Rumpf
- *** Der äußerste Funktor von Rumpf ist nicht :- / 1
-
- Term ::= Term1200
- TermN ::= Opfx,N TermN-1 | Opfy,N TermN |
- TermN-1 Opxf,N | TermN Opyf,N |
- TermN-1 Opxfx,N TermN-1 |
- TermN-1 Opxfy,N TermN |
- TermN Opyfx,N TermN-1 |
- TermN Opyfy,N TermN | TermN-1
- *** 1 ≤ N ≤ 1200; OpTyp,N ist ein Operator mit Typ 'Typ' und
- *** Priorität N; TermN kann man 'Term mit Priorität N' nennen.
- Term0 ::= Variable | Integer | Zeichenkette |
- Liste | Nicht_Operator |
- Nicht_Operator ( Term { , Term } ) |
- ( Term ) | Klammer_Term
- Klammer_Term ::= { Term }
- Nicht_Operator ::= Funktor
- OpT,N ::= Funktor
- *** T ∈ { fx, fy, xf, yf, xfx, xfy, yfx, yfy }, 1 ≤ N ≤ 1200
- *** siehe auch Bemerkung 1
- Liste ::= [] | [ Term999 { , Term999 } ] |
- [ Term999 { , Term999 } | Term ]
- *** Terme mit Priorität 999 können ohne Klammern mit Kommas
- *** verbunden werden ( , / 2 hat Priorität 1000)
- Funktor ::= Wort | Q_Name | Symbol | Einzelzeichen
- Wort ::= Wortanfang { Alphanum }
- Wortanfang ::= Kleinbuchstabe
- Alphanum ::= Kleinbuchstabe | Großbuchstabe |
- Ziffer | _
- Q_Name ::= ' { Q_Zeichen } '
- Q_Zeichen ::= '' | Nicht_'
- *** Nicht_' ist ein beliebiges Zeichen außer '
- Symbol ::= Symbolzeichen { Symbolzeichen }
- Variable ::= Variablenanfang { Alphanum }
- Variablenanfang ::= Großbuchstabe | _
- Integer ::= - Ziffer { Ziffer } | Ziffer { Ziffer }
- Zeichenkette ::= " { S_Zeichen } "
- *** In TOY bedeutet eine Zeichenkette eine Liste aus den Namen
- *** der Zeichen, in Prolog-10 eine Liste ihrer ASCII-Codes
- S_Zeichen ::= "" | Nicht_"
- *** Nicht_" ist ein beliebiges Zeichen außer "
- Kleinbuchstabe ::= a | b | c | d | e | f | g | h | i |
- j | k | l | m | n | o | p | q | r |
- s | t | u | v | w | x | y | z | ü |
- é | â | ä | à | å | ç | ê | ë | è |
- ï | î | ì | æ | ô | ö | ò | û | ù |
- ÿ | ß | ƒ | á | í | ó | ú | ñ | ª |
- º | ã | õ | ø | œ | ij
- Großbuchstabe ::= A | B | C | D | E | F | G | H | I |
- J | K | L | M | N | O | P | Q | R |
- S | T | U | V | W | X | Y | Z | Ç |
- Ä | Å | É | Æ | Ö | Ü | Ñ | Ø | Œ |
- À | Ã | Õ | IJ
- Ziffer ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
- Symbolzeichen ::= # | $ | & | * | + | - | . | / | : |
- < | = | > | ? | @ | \ | ^ | ` | ~ |
- | ¢ | £ | ¥ | ¿ | ⌐ | ¬ | ¡ | « |
- » | § | ∧ | ∞ | ≡ | ± | ≥ | ≤ | ÷ |
- ≈ | ¯
- *** Ein einzelner Punkt, gefolgt von Leerraum,
- *** ist kein Symbolzeichen, sondern ein Ende_Punkt.
- Einzelzeichen ::= , | ; | !
- Zeichengruppe ::= Funktor | Variable | Integer |
- Zeichenkette | Klammer_oder_Strich
- *** Zeichengruppen werden in Bemerkung 6 verwendet, s.u.
- Klammer_oder_Strich ::= ( | ) | [ | ] | { | } | |
- Kommentar ::= % { Nicht_Zeilenende } Zeilenende
- *** Zeilenende ist ein Zeichen, das das Ende einer Zeile angibt,
- *** Nicht_Zeilenende ist ein beliebiges anderes Zeichen.
- *** TOY Prolog wandelt alle Zeilenenden in einzelne CR-Zeichen um.
- Leerraum ::= { Kontrollzeichen }
- *** Kontrollzeichen ist 'SPACE' oder 'TAB' oder Zeilenende oder
- *** ein beliebiges nichtdruckbares Zeichen (ASCII-Code < 32).
- Ende_Punkt ::= . Kontrollzeichen
-
- Bemerkungen:
- (1) Gemischte Operatoren wurden nicht in die Beschreibung mit
- aufgenommen, aber die Regeln dafür haben alle dieselbe Form
- wie z.B.
-
- TermN ::= Op[xfy,fx],N TermN-1
-
- (es gibt noch 11 weitere Regeln für gemischte Operatoren).
-
- In TOY Prolog kann ein gemischter Operator höchstens einen
- unären und einen binären Typ besitzen, beide mit derselben
- Priorität.
-
- (2) Es gibt viele mehrdeutige Kombinationen von zusammenhängenden
- Operatoren, die nicht von dieser Beschreibung erfaßt werden.
-
- (3) Nicht alle Funktoren (z.B. Namen in Apostrophen) können als
- Operatoren vereinbart werden.
-
- (4) In der Beschreibung von Rumpf hätte man die gesonderte
- Betrachtung von , / 2 und ; / 2 weglassen können, da beide
- normalerweise als Infix-Operatoren vereinbart sind. Die Regel
-
- Rumpf ::= Funktor_Term
-
- hätte aber die im Regelfall auftretende Struktur eines
- Rumpfes verschleiert.
-
- (5) Die Syntax für Direktiven (Kommandos und Anfragen) orientiert
- sich an der in TOY Prolog verwendeten Benutzerschnittstelle.
-
- (6) Kommentare und Leerraum können beliebig vor und hinter
- Zeichengruppen eingesetzt werden, nicht jedoch im Innern
- einer Zeichengruppe. Ein Kommentar erstreckt sich nur bis zum
- nächsten Zeilenende.
-
- (7) Zwischen einem Minuszeichen, das als Funktor behandelt werden
- soll, und einer vorzeichenlosen Integerzahl muß ein Leerraum
- stehen. Ein Minuszeichen direkt vor einer Ziffernfolge wird
- als Vorzeichen betrachtet.
-
- (8) Ein eingegebener Term muß mit einem Ende_Punkt (außerhalb
- eines apostrophiertens Namens, einer Zeichenkette oder eines
- Kommentares) abgeschlossen werden
-
- (9) TOY Prolog benutzt einen einfachen Unifikationsalgorithmus
- ohne 'occurrence check'. Daher können z.B. die Terme
-
- X und f(X)
-
- unifiziert werden. Dabei entstehen zyklische Datenstrukturen,
- die bei unvorsichtiger Programmierung den Interpreter bei der
- Ausgabe oder der Unifikation in eine Endlosschleife führen
- können. Bei solchen Strukturen ist daher Vorsicht geboten.
-
-
- II.2 Die Benutzerschnittstelle
-
- Die Benutzerschnittstelle von TOY Prolog ist in Prolog selbst
- geschrieben. Dabei wurde ein Zwischencode verwendet, der nur
- leichte Einschränkungen gegenüber der vollständigen Syntax
- aufweist, der aber leicht in den vom inneren Interpreter benutzten
- Code übersetzt werden kann. Näheres dazu im Anhang.
-
- Der innere Interpreter ruft das Prädikat ear / 0 auf, sobald er
- vom Benutzer-Eingabestrom 'user' lesen soll.
- Dieses Prädikat ruft die Hauptschleife des äußeren Interpreters
- auf; ihr Name ist loop / 0.
- In der Schleife wird der Benutzer durch den Prompt
- ?-
- aufgefordert, einen Term einzugeben, der danach auf folgende Weise
- ausgeführt wird :
-
- (1) Variablen oder fehlerhafte Terme werden ignoriert.
- (2) Zahlen erzeugen eine Fehlermeldung.
- (3) Terme der Form "Kopf :- Rumpf" oder "Links --> Rechts" werden
- als Regeln in die Datenbank übernommen (grammatische Regeln
- mit '-->' werden vorher übersetzt).
- (4) Terme der Form ":- Rumpf" werden als Kommandos angesehen und
- deterministisch ausgeführt.
- (5) Eine Liste wird als Liste von Dateinamen betrachtet. Zur
- Auswertung der Liste wird das Prädikat 'consultall'
- aufgerufen.
- (6) Alle anderen Terme werden als Anfragen behandelt : es wird
- versucht, das beschriebene Ziel zu erfüllen. Gelingt das, so
- werden die resultierenden Variableninstantiierungen
- ausgegeben, und der Interpreter wartet auf die Eingabe eines
- Zeichens. Ist es das Zeichen ';', so wird versucht, die
- Anfrage neu zu erfüllen.
- Enthält die Anfrage keine Variablen, so wird bei Gelingen
- 'yes' ausgegeben.
- Schlägt die Anfrage fehl, so wird 'no' ausgegeben.
-
- Durch Aufruf des Prädikats 'stop' wird das Programm abgebrochen.
-
-
- III. Systemfunktionen und vordefinierte Prädikate
-
- III.1 Allgemeines
-
- Systemfunktionen sind Funktionen, die im eigentlichen (inneren)
- Interpreter implementiert sind, vordefinierte Prädikate sind in
- Prolog geschrieben und werden nach dem Start des Interpreters aus
- der Systemdatei 'SYSFILE.TOY' gelesen (siehe dazu den Anhang).
-
- Die grundlegenden Funktionen von Prolog-10 werden durch diese
- beiden Gruppen abgedeckt. In der ATARI-Version wurden viele
- zusätzliche Systemfunktionen implementiert, die den Zugriff auf
- spezielle Eigenschaften des ST (GEM - Grafikroutinen und
- Echtzeituhr) ermöglichen.
-
- Eine Systemfunktion kann drei verschiedene Ergebnisse produzieren:
- sie kann fehlschlagen, erfüllt werden, oder einen Systemfehler
- produzieren. Wird eine Systemfunktion erfüllt, so treten
- üblicherweise Nebeneffekte auf (z.B. Ausgabefunktionen).
-
- Ein auftretender Fehler kann zur Folge haben, daß der Versuch, das
- aktuelle Ziel zu erfüllen, vollständig abgebrochen wird; es kann
- sogar (bei Speicherüberlauf) zum Abbruch des Interpreters kommen.
- Ein derart schwerwiegender Fehler wird durch die Meldung
- "Fatal error : ..." angezeigt. Nach einem solchen Fehler startet
- der Interpreter selbständig das Prädikat ear / 0, falls nicht
- gerade eine Datei eingelesen wird. Im Falle von Fehlern beim
- Öffnen oder Schließen von Dateien werden vorher Eingabe und
- Ausgabe wieder auf Tastatur bzw. Bildschirm umgeleitet.
-
- Im Normalfall wird ein Fehler jedoch durch andere Umstände
- verursacht, z.B. durch fehlerhafte Parameter beim Aufruf einer
- Systemfunktion. In diesem Fall wird die Erfüllung des aktuellen
- Zieles nicht abgebrochen; es wird fortgefahren, als ob der den
- Fehler verursachende Term ein Aufruf des Prädikats error / 1 ist.
- Das Argument von error(...) ist dabei der fehlerhafte Aufruf
- selbst. error / 1 ist in Prolog geschrieben und befindet sich in
- der Systemdatei; der Benutzer kann eigene Fehlerroutinen
- schreiben. error(...) kann auch explizit aufgerufen werden. In der
- vorliegenden Version gibt error(Call) eine Meldung der Form
- "System call error : Call" aus, wenn der äußerste Funktor von Call
- eine Systemfunktion bezeichnet, andernfalls einfach
- "Error : Call". Nach der Ausgabe schlägt error / 1 fehl.
-
-
- III.2 Beschreibung der Systemfunktionen und vordefinierten
- Prädikate
-
- Bemerkung: In den folgenden Beschreibungen werden Aussagen wie
- "ein Prädikat versucht, zwei Terme zu unifizieren"
- gemacht, wenn das Prädikat je nach dem Ergebnis der
- Unifikation fehlschlägt oder erfüllt wird. Nach der
- Erfüllung sind die Terme unifiziert.
- "Ein Prädikat prüft eine Bedingung" bedeutet, daß
- es je nach dem Ergebnis der Bedingung fehlschlägt
- oder erfüllt wird.
-
- Parameter werden in den Beschreibungen wie folgt bezeichnet :
-
- TERM irgendein Term
- INTEGER eine Integer-Zahl
- VAR eine Variable
- VARINT eine Integer-Zahl oder eine Variable
- F_TERM ein Term mit Funktor und keinem oder mehreren
- Argumenten
- AUFRUF siehe F_TERM (aber im Sinne eines zu erfüllenden
- Zieles)
- ATOM ein Funktor ohne Argumente
- NAME siehe ATOM (aber die betrachtete Funktion bezieht
- sich auf den druckbaren Namen des Funktors)
- ZEICHEN ein aus einem einzelnen Zeichen bestehender NAME
- DATEINAME der Name eines Standard-Ein-/Ausgabestroms (siehe
- die Funktionen see/tell etc.), oder eine
- Spezifikation für eine Diskettendatei des TOS, also
- z.B. 'B:\ORDNER.1\PROLOG\DATEN.PRO'
- AUFRUFLISTE eine (möglicherweise leere) Liste von AUFRUFEN
- ZEICHENLISTE eine (möglicherweise leere) Liste von ZEICHEN
- ZIFFERNLISTE eine ZEICHENLISTE aus Ziffernzeichen
-
- Die Parameter des beschriebenen Prädikates werden mit PAR_1, PAR_2
- usw. bezeichnet.
-
- In TOY Prolog existieren vordefinierte Operatoren, von denen
- einige die Namen von Prädikaten sind. Eine Liste davon befindet
- sich bei der Beschreibung von op / 3 in Abschnitt III.2.5.4.
-
-
- III.2.1 Allgemeine Prädikate
-
- true
- kann immer erfüllt werden.
-
- fail
- schlägt immer fehl.
-
- not AUFRUF
- wird erfüllt genau dann, wenn AUFRUF fehlschlägt.
-
- AUFRUF, AUFRUF
- wird genau dann erfüllt, wenn beide Parameter
- erfüllt werden können.
-
- AUFRUF; AUFRUF
- wird genau dann erfüllt, wenn einer der Parameter
- erfüllt werden kann.
-
- check (AUFRUF)
- wird genau dann erfüllt, wenn der Parameter erfüllt
- werden kann, aber instantiiert keine Variablen.
-
- side_effects (AUFRUF)
- äquivalent zu check(AUFRUF); sollte benutzt werden,
- um zu betonen, daß die Seiteneffekte von AUFRUF
- wichtig sind.
-
- once (AUFRUF)
- versucht, AUFRUF deterministisch (genau einmal) zu
- erfüllen.
-
-
- III.2.2 Arithmetik mit Integer-Zahlen
-
- sum (INTEGER, INTEGER, INTEGER)
- wird erfüllt genau dann, wenn PAR_1+PAR_2 = PAR_3.
-
- sum (INTEGER, INTEGER, VAR)
- wird erfüllt, nachdem PAR_3 mit dem Wert von
- PAR_1+PAR_2 unifiziert wurde.
-
- sum (INTEGER, VAR, INTEGER)
- wird erfüllt, nachdem PAR_2 mit dem Wert von
- PAR_3-PAR_1 unifiziert wurde.
-
- sum (VAR, INTEGER, INTEGER)
- wird erfüllt, nachdem PAR_1 mit dem Wert von
- PAR_3-PAR_2 unifiziert wurde.
-
-
- prod (INTEGER, INTEGER, INTEGER, INTEGER)
- wird erfüllt genau dann, wenn PAR_1*PAR_2+PAR_3 =
- PAR_4.
-
- prod (INTEGER, INTEGER, INTEGER, VAR)
- wird erfüllt, nachdem PAR_4 mit dem Wert von
- PAR_1*PAR_2+PAR_3 unifiziert wurde.
-
- prod (INTEGER, INTEGER, VAR, INTEGER)
- wird erfüllt, nachdem PAR_3 mit dem Wert von
- PAR_4-PAR_1*PAR_2 unifiziert wurde.
-
- prod (INTEGER, VAR, VAR, INTEGER)
- wird erfüllt, nachdem PAR_2 mit dem Wert von
- PAR_4 div PAR_1 und PAR_3 mit dem Wert von PAR_4
- mod PAR_1 unifiziert wurde.
-
- prod (VAR, INTEGER, VAR, INTEGER)
- wie der vorherige Fall, aber PAR_1 vertauscht mit
- PAR_2.
-
- prod (INTEGER, VAR, INTEGER, INTEGER)
- schlägt fehl, wenn (PAR_4-PAR_3) mod PAR_1 ungleich
- 0 ist; andernfalls wird es erfült, nachdem PAR_2
- mit dem Wert von (PAR_4-PAR_3) div PAR_1 unifiziert
- wurde.
-
- prod (VAR, INTEGER, INTEGER, INTEGER)
- wie der vorherige Fall, aber PAR_1 vertauscht mit
- PAR_2.
-
-
- TERM is TERM
- Es wird angenommen, daß PAR_2 ein aus INTEGERs und
- den Standardoperatoren +, - (beide binär oder
- unär), *, / und mod zusammengesetzter
- arithmetischer Ausdruck ist; falls nicht, schlägt
- das Prädikat fehl (es kann auch zu Systemfehlern
- kommen, falls PAR_2 freie Variablen enthält).
- Falls PAR_2 ein Ausdruck ist, wird sein Wert
- berechnet und versucht, PAR_1 damit zu unifizieren.
- is kann auch eine Liste der Form [ INTEGER ] als
- den Wert dieser Integer-Zahl berechnen (nach den
- Konventionen von Prolog-10).
-
-
- is wird von anderen Prädikaten benutzt, die ihre
- Argumente als Ausdrücke ansehen,z.B. den folgenden.
-
-
- III.2.3 Vergleich von Zahlen bzw. Namen
-
-
- less (INTEGER, INTEGER)
- wird erfüllt genau dann, wenn PAR_1 < PAR_2.
-
- TERM =:= TERM
- wird erfüllt genau dann, wenn PAR_1 und PAR_2
- arithmetische Ausdrücke sind, die denselben Wert
- haben.
-
- TERM =\= TERM ( =\= )
- wie =:=, aber überprüft, ob die Werte verschieden
- sind.
-
- TERM < TERM ( < )
- wie =:=, aber überprüft, ob der Wert von PAR_1
- kleiner als der Wert von PAR_2 ist.
-
- TERM =< TERM ( =< )
- wie <, aber überprüft auf "kleiner oder gleich".
-
- TERM > TERM ( > )
- wie <, aber überprüft auf "größer".
-
- TERM >= TERM ( >= )
- wie <, aber überprüft auf "größer oder gleich".
-
-
- NAME @< NAME ( @< )
- wird genau dann erfüllt, wenn PAR_1 in der durch
- den erweiterten ASCII-Zeichensatz des ATARI ST
- definierten lexikographischen Reihenfolge vor PAR_2
- steht.
-
- NAME @=< NAME ( @=< )
- wie @<, aber überprüft auf "kleiner oder gleich".
-
- NAME @> NAME ( @> )
- wie @<, aber überprüft auf "größer".
-
- NAME @>= NAME ( @>= )
- wie @<, aber überprüft auf "größer oder gleich".
-
-
- III.2.4 Vergleich von Termen
-
- TERM = TERM
- versucht, PAR_1 und PAR_2 zu unifizieren.
-
- eqvar (VAR, VAR)
- wird genau dann erfüllt, wenn PAR_1 und PAR_2 zwei
- Instanzen derselben, nicht-anonymen Variable sind.
-
- TERM == TERM
- wird genau dann erfüllt, wenn PAR_1 und PAR_2 zwei
- Instanzen desselben Terms sind.
-
- TERM \== TERM ( \== )
- wird genau dann erfüllt, wenn PAR_1 und PAR_2 nicht
- zwei Instanzen desselben Terms sind.
-
-
- III.2.5 Ein- und Ausgabe
-
- III.2.5.1 Datenströme
-
- Die Ein- und Ausgabe in TOY Prolog ST ist an Datenströmen
- orientiert. Ein Datenstrom ist (vom Benutzer aus gesehen) der Name
- bzw. die vollständige Spezifikation einer Diskettendatei, oder der
- vordefinierte Name eines speziellen Ein- oder Ausgabegerätes.
-
- Auf eine Diskettendatei kann - sofern sie nicht vom Betriebssystem
- aus gegen Überschreiben geschützt ist, und sie sich nicht auf
- einer schreibgeschützten Diskette befindet, schreibend und lesend
- zugegriffen werden. Namen von Datei-Strömen können z.B. sein :
-
- editor (eines der Hilfsprogramme)
- 'sysfile.toy' (die Systemdatei)
- 'b:\ordner.1\daten' (eine Datei namens 'daten' auf einer Diskette
- im Laufwerk B im Ordner 'ordner.1')
-
- Bei Datei-Strömen können Groß- und Kleinschreibung beliebig
- gewählt werden.
-
- Ein Dateistrom kann nur in eine Richtung, also nur lesend oder nur
- schreibend, geöffnet werden. Wird ein Dateistrom mehrmals in einer
- Richtung geöffnet, so hat das keine Wirkung.
-
- Die vordefinierten Datenströme sind vorhanden, um mit anderen
- Geräten bzw. Komponenten des Computers zu kommunizieren.
- Auf die vordefinierten Datenströme kann nicht immer lesend und
- schreibend zugegriffen werden, aber ein vordefinierter Datenstrom
- kann, falls Lese- und Schreibzugriff erlaubt sind, in beide
- Richtungen gleichzeitig geöffnet werden.
-
- Eine Liste der vordefinierten Datenströme mit den erlaubten
- Zugriffsarten :
-
- Name Lesezugriff Schreibzugriff
-
- user Standard-Benutzereingabe Standard-Benutzerausgabe
- (Tastatur, gepuffert) (Bildschirm)
-
- keybd Benutzereingabe Ausgabe an den
- (Tastatur, Einzelzeichen) Tastaturcontroller.
-
- modem RS232-Interface lesen RS232 schreiben
-
- midi MIDI-Interface lesen MIDI schreiben
-
- printer nicht erlaubt ! Centronics-Interface
-
- Diese Namen können wieder groß- oder kleingeschrieben werden (bei
- Großschreibung Apostrophen nicht vergessen).
-
-
- III.2.5.2 Umschalten der Ein- und Ausgabeströme
-
- Es können bis zu 16 Dateiströme gleichzeitig offen sein.
-
- see (DATEINAME)
- der angegebene Datenstrom wird zum aktuellen
- Eingabestrom; handelt es sich um eine noch nicht
- geöffnete Datei, so wird diese zum Lesen geöffnet.
-
- seeing (TERM)
- versucht, den Parameter mit dem aktuellen
- Eingabestrom zu unifizieren.
-
- seen
- ist der aktuellen Eingabestrom eine Datei, so wird
- sie geschlossen. Der vordefinierte Datenstrom
- 'user' wird zum aktuellen Eingabestrom.
-
- tell (DATEINAME)
- der angegebene Datenstrom wird zum aktuellen
- Ausgabestrom; handelt es sich um eine noch nicht
- geöffnete Datei, so wird diese auf der Diskette
- erzeugt (eine eventuell vorhandene Datei mit dem
- gleichen Namen wird gelöscht !) und zum Schreiben
- geöffnet.
-
- telling (TERM)
- versucht, den Parameter mit dem aktuellen
- Ausgabestrom zu unifizieren.
-
- told
- ist der aktuelle Ausgabestrom eine Datei, so wird
- sie geschlossen. Der vorgefinierte Datenstrom
- 'user' wird zum aktuellen Ausgabestrom.
-
-
- III.2.5.3 Kontrolle der Eingabe
-
- TOY Prolog besitzt die Fähigkeit, die von einem Dateistrom oder
- einem Peripheriegerät eingelesenen Zeichen zur Kontrolle auf dem
- Bildschirm auszugeben.
-
- echo
- schaltet die Kontrollausgabe ein.
-
- noecho
- schaltet die Kontrollausgabe aus.
-
-
- III.2.5.4 Ein- und Ausgabe von Termen; Operatoren
-
-
- display (TERM)
- gibt TERM in Standardform auf den aktuellen
- Ausgabestrom aus : Funktoren werden in Präfixform
- mit Klammern ausgegeben, Namen werden nicht in
- Apostrophen gesetzt; Variablen werden als _N
- ausgegeben, wobei N eine Zahl ist.
-
- write (TERM)
- gibt TERM auf den aktuellen Ausgabestrom aus; die
- momentanen Operatorvereinbarungen werden beachtet,
- aber Namen werden nicht in Apostrophen gesetzt.
- Variablen werden in der Form XN ausgegeben, wobei N
- eine Zahl ist; die Numerierung beginnt bei 1.
- Achtung : In TOY Prolog wird zur Ausgabe von
- Variablen ein Prädikat benutzt, das die Variablen
- numeriert, indem es sie an Terme der Form 'V'(N)
- bindet. Aus diesem Grund werden Terme der Form
- 'V'(N) nicht korrekt ausgegeben, wenn N eine
- Integer-Zahl ist.
-
- writeq (TERM)
- wie 'write', aber Namen, die keine wohlgeformten
- Worte darstellen, oder die in Konflikt zu einer
- momentanen Operatorvereinbarung stehen, werden in
- Apostrophen gesetzt. Terme, die mit 'writeq'
- ausgegeben wurden, können mit 'read' wieder
- eingelesen werden.
-
- read (TERM)
- liest einen durch einen Punkt abgeschlossenen Term
- vom aktuellen Eingabestrom; wird nur erfüllt, wenn
- dieser Term mit PAR_1 unifiziert werden kann. Die
- momentanen Operatorvereinbarungen werden beachtet.
- Falls der eingegebene Term syntaktische Fehler
- enthält, so wird die Meldung
- "Bad Term on input. Text skipped:"
- ausgegeben, und der eingegebene Text bis zum
- nächsten Punkt außerhalb eines Kommentares und
- außerhalb von Anführungszeichen übersprungen (falls
- kein Punkt vorhanden ist, sollte der Benutzer ihn
- eingeben). Danach wird versucht, PAR_1 mit 'e r r'
- zu unifizieren.
- Am Ende eines Dateistromes wird die Eingabe auf
- 'user' umgeschaltet.
-
-
- op (INTEGER, ATOM, ATOM)
- vereinbart PAR_3 als Operator mit Typ PAR_2 und
- Priorität PAR_1. Es muß gelten 1 ≤ PAR_1 ≤ 1200;
- Operatoren mit kleinerer Priorität haben Vorrang.
- Die Priorität sollte kleiner als 1000 sein, um
- Konflikte mit den Operatoren ',', ';', ':-' und
- '-->' zu vermeiden.
- PAR_2 muß aus der Menge { xf, yf, fx, fy, xfx, xfy,
- yfx, yfy } gewählt werden. PAR_3 muß ohne
- Apostrophen druckbar sein.
- Falls für PAR_3 bereits eine Operatorvereinbarung
- besteht, so wird diese gemäß den Angaben von PAR_1
- und PAR_2, modifiziert : die neue Priorität ersetzt
- die alte und der neue unäre (bzw. binäre) Typ
- ersetzt den alten unären (bzw. binären) Typ. In TOY
- Prolog kann ein Operator nur einen unären und einen
- binären Typ gleichzeitig besitzen (beide mit der
- gleichen Priorität).
-
- delop (ATOM)
- die Operatorvereinbarung für PAR_1 wird gelöscht.
- PAR_1 sollte in Apostrophen gesetzt werden, da es
- zum Zeitpunkt der Eingabe von 'delop' ja noch ein
- Operator ist.
-
- Folgende Standardoperatoren sind bereits vereinbart :
-
- :- xfx, fx 1200
- --> xfx 1200
- ; xfy 1100
- , xfy 1000
- not fy 900
- = xfx 700
- is xfx 700
- =:= xfx 700
- =\= xfx 700
- < xfx 700
- =< xfx 700
- > xfx 700
- >= xfx 700
- @< xfx 700
- @=< xfx 700
- @> xfx 700
- @>= xfx 700
- == xfx 700
- \== xfx 700
- =.. xfx 700
- + yfx, fx 500
- - yfx, fx 500
- * yfx 400
- / yfx 400
- mod xfx 300
-
-
- III.2.5.5 Einzelzeichen
-
- In TOY Prolog werden Einzelzeichen, anders als in Prolog-10, durch
- Atome dargestellt, deren Namen aus genau einem Zeichen besteht (in
- Prolog-10 als deren ASCII-Darstellung, also als Zahlen).
- TOY Prolog ST unterstützt den erweiterten Zeichensatz von GEM;
- dabei werden deutsche (französische, spanische, ...) Buchstaben
- auch wirklich als Buchstaben erkannt (!).
- Für Zeichenketten existiert eine besondere Darstellungsform.
- Zeichenketten werden als Listen von Einzelzeichen betrachtet
- (nicht wie in Prolog-10 als Listen von ASCII-Codes); die Notation
- für Zeichenketten benutzt Anführungszeichen ("), um eine
- Zeichenkette einzuschließen. Wie üblich bezeichnet ein
- verdoppeltes Anführungszeichen ("") im Inneren einer Zeichenkette
- ein in die Zeichenkette aufzunehmendes einzelnes ".
-
- Die folgenden Prädikate sind für die Verarbeitung von
- Einzelzeichen vorgesehen:
-
- ordchr (INTEGER, ZEICHEN)
- wird genau dann erfüllt, wenn PAR_1 die Ordinalzahl
- des Zeichens PAR_2 ist.
-
- ordchr (VAR, ZEICHEN)
- wird erfüllt, nachdem PAR_1 mit der Ordinalzahl von
- PAR_2 unifiziert wurde.
-
- ordchr (INTEGER, VAR)
- wird erfüllt, nachdem PAR_2 mit dem Zeichen
- unifiziert wurde, dessen Ordinalzahl PAR_1 mod 256
- ist.
-
- iseoln (TERM)
- versucht, PAR_1 mit dem Zeilenendezeichen zu
- unifizieren. TOY Prolog wandelt jedes Zeilenende in
- ein einzelnes 'CR' um.
-
- smalletter (TERM)
- überprüft, ob PAR_1 ein Kleinbuchstabe ist.
-
- bigletter (TERM)
- überprüft, ob PAR_1 ein Großbuchstabe ist.
-
- letter (TERM)
- überprüft, ob PAR_1 ein Buchstabe ist.
-
- digit (TERM)
- überprüft, ob PAR_1 eine Dezimalziffer ist.
-
- alphanum (TERM)
- überprüft, ob PAR_1 ein Buchstabe, eine Ziffer oder
- ein Tiefstrich (_) ist.
-
-
- bracket (TERM)
- überprüft, ob PAR_1 eines der Zeichen ( ) [ ] { }
- ist.
-
- solochar (TERM)
- überprüft, ob PAR_1 eines der Zeichen ! , ; ist.
-
- symch (TERM)
- überprüft, ob PAR_1 ein Symbolzeichen ist.
-
-
- III.2.5.6 Ein- und Ausgabe von Einzelzeichen
-
- Für die Ein- und Ausgabe von Einzelzeichen gibt es eine Anzahl
- besonderer Prädikate. Diese arbeiten nicht - wie in Prolog-10 -
- mit ASCII-Codes. Die Prädikate von Prolog-10, die die Ein- und
- Ausgabe von Einzelzeichen erledigen, könnten etwa wie folgt
- definiert werden (nicht vollständig kompatibel):
-
- get0(Ord) :- rch, lastch(Ch), ordchr(Ord, Ch).
- get(Ord) :- rch, skipbl, lastch(Ch), ordchr(Ord, Ch).
- skip(X) :- repeat, get0(X), !.
- put(Ord) :- ordchr(Ord, Ch), wch(Ch).
-
- Der Hauptunterschied zwischen TOY Prolog und Prolog-10 bei der
- Verarbeitung von Einzelzeichen liegt darin, daß TOY Prolog einen
- Puffer für das letzte eingegebene Zeichen unterhält; in TOY Prolog
- kann daher mehrmals, auch nach eventuellem Backtracking, auf ein
- eingegebenes Zeichen zugegriffen werden.
-
- Wird bei der Eingabe ein Zeilenende erreicht, so wird es als ein
- einzelnes 'CR' in den Eingabepuffer ("letztes Zeichen")
- geschrieben. Wird das Ende eines Dateistromes erreicht, so führt
- der Interpreter selbständig das Prädikat 'seen' aus; die folgenden
- Zeichen werden vom Benutzerstrom gelesen. Dieser Vorgang wird dem
- Benutzer durch eine Meldung mitgeteilt.
-
-
- Die Prädikate für die Ein- und Ausgabe von Einzelzeichen :
-
- rch
- wird erfüllt, nachdem das nächste Zeichen vom
- aktuellen Eingabestrom in das letzte Zeichen
- geschrieben wurde.
-
- skipbl
- wird erfüllt, nachdem sichergestellt wurde, daß das
- letzte Zeichen ein druckbares Zeichen enthält
- (ASCII-Code > 32). Falls ein solches Zeichen
- bereits im letzten Zeichen steht, wird nichts
- getan, andernfalls wird 'rch' ausgeführt.
-
- lastch (TERM)
- versucht, PAR_1 mit dem letzten Zeichen zu
- unifizieren.
-
- rdch (TERM)
- liest das nächste Zeichen vom Eingabestrom und
- schreibt es in das letzte Zeichen; macht eine Kopie
- des letzten Zeichens, wobei nichtdruckbare Zeichen
- als Leerraum angesehen werden; versucht, die Kopie
- mit PAR_1 zu unifizieren.
-
- rdchsk (TERM)
- wie 'rdch', aber vorher wird 'skipbl' ausgeführt.
-
- wch (ZEICHEN)
- schreibt das Zeichen in den aktuellen Ausgabestrom.
- 'CR' wird als Zeilentrenner interpretiert.
-
- nl
- beendet die momentane Zeile (gibt 'CR' aus).
-
- bell
- gibt das Zeichen 'Bel' aus; bei Ausgabe auf den
- Benutzerstrom bewirkt dieses Zeichen das Ertönen
- eines 'Glockentones'.
-
- Der ATARI ST interpretiert das Zeichen 'Esc' (escape) als
- besonderes Steuerzeichen; wird 'Esc' auf den Benutzerstrom
- ausgegeben, so bewirken die nächsten 1-3 Zeichen eine Veränderung
- von Parametern der Bildschirmausgabe. Es existieren spezielle
- Prädikate zur Ausgabe von Escape-Sequenzen :
-
- escape
- gibt 'Esc' aus.
-
- cls
- gibt 'Esc', 'E' aus; der Bildschirminhalt wird
- gelöscht.
-
-
- III.2.6 Typenüberprüfung
-
- var (TERM)
- wird genau dann erfüllt, wenn PAR_1 eine freie
- Variable ist.
-
- integer (TERM)
- wird genau dann erfüllt, wenn PAR_1 eine Integer-
- Zahl ist.
-
- nonvarint (TERM)
- wird genau dann erfüllt, wenn PAR_1 ein F_TERM ist.
-
- atom (TERM)
- wird genau dann erfüllt, wenn PAR_1 ein ATOM ist.
-
-
- III.2.7 Zugriff auf die Termstruktur
-
- pname (NAME, TERM)
- erzeugt eine Liste der einzelnen Zeichen von PAR_1
- und versucht, diese Liste mit PAR_2 zu unifizieren.
-
- pname (VAR, ZEICHENLISTE)
- wird erfüllt, nachdem PAR_1 mit einem NAMEn
- unifiziert wurde, der aus den einzelnen Zeichen von
- PAR_2 besteht.
-
- pnamei (INTEGER, TERM)
- erzeugt eine Liste von Ziffernzeichen, die die
- dezimale Darstellung von PAR_1 bilden, und
- versucht, diese Liste mit PAR_2 zu unifizieren.
- PAR_1 darf nicht negativ sein.
-
- pnamei (VAR, ZIFFERNLISTE)
- wird erfüllt, nachdem PAR_1 mit der Integer-Zahl
- unifiziert wurde, deren Dezimaldarstellung die
- Zeichen von PAR_2 sind. Auch bei korrekten
- Parametern kann ein Fehler auftreten, wenn die Zahl
- größer als die größte darstellbare Integer-Zahl
- wird. In dieser Implementation sind Zahlen bis
- 32767 ( = 215-1) darstellbar.
-
- 'pname' und 'pnamei' ersetzen die Funktion 'name' von Prolog-10,
- die zwar ähnlich arbeitet, aber ASCII-Codes anstelle der in TOY
- Prolog verwendeten Zeichendarstellung benutzt.
-
-
- functor (VAR, INTEGER, 0)
- PAR_3 ist die Zahl 0; dieser Aufruf wird erfüllt,
- nachdem PAR_1 mit PAR_2 unifiziert wurde.
-
- functor (VAR, NAME, INTEGER)
- wird erfüllt, nachdem PAR_1 mit einem F_TERM
- unifiziert wurde, dessen Funktor den Namen und die
- Stelligkeit hat, die durch PAR_2 und PAR_3
- festgelegt werden, und dessen Argumente
- verschiedene freie Variablen sind. PAR_3 darf nicht
- negativ sein.
-
- functor (INTEGER, TERM, TERM)
- versucht, PAR_2 mit PAR_1 und PAR_3 mit der Zahl 0
- zu unifizieren.
-
- functor (F_TERM, TERM, TERM)
- versucht, PAR_2 mit dem Namen und PAR_3 mit der
- Stelligkeit des äußersten Funktors von PAR_1 zu
- unifizieren.
-
- arg (INTEGER, F_TERM, TERM)
- schlägt fehl, falls PAR_1 kleiner als 1 oder größer
- als die Stelligkeit des äußersten Funktors von
- PAR_2 ist; ansonsten wird versucht, PAR_3 mit dem
- PAR_1-ten Argument von PAR_2 zu unifizieren.
-
- VAR =.. [INTEGER]
- wird erfüllt, nachdem PAR_1 mit der Zahl in PAR_2
- unifiziert wurde.
-
- VAR =.. [NAME | TERM]
- falls der TERM in PAR_2 keine 'geschlossene' Liste
- ist, wird ein Fehler im Prädikat length / 2 erzeugt
- ('=..' benutzt 'length'). Ansonsten wird ein Term
- erzeugt, dessen Funktor NAME und dessen
- Argumentliste TERM ist;dieser Term wird mit PAR_1
- unifiziert.
-
- INTEGER =.. TERM
- versucht, PAR_2 mit [PAR_1] zu unifizieren.
-
- F_TERM =.. TERM
- erzeugt eine Liste, deren Kopf der äußerste Funktor
- von PAR_1 und deren Rumpf die Liste der Argumente
- von PAR_1 ist; versucht, diese Liste mit PAR_2 zu
- unifizieren.
-
-
- III.2.8 Zugriff auf Prädikate in der Datenbank
-
- protect (NAME, INTEGER)
- schützt das Prädikat mit Namen PAR_1 und
- Stelligkeit PAR_2 gegen Veränderungen durch die
- weiter unten angegebenen Prädikate.
-
- protect
- schützt sämtliche in der Datenbank vorhandenen
- Prädikate.
-
- unprotect (NAME, INTEGER)
- hebt den Schutz für das Prädikat mit Namen PAR_1
- und Stelligkeit PAR_2 wieder auf.
-
- unprotect
- hebt den Schutz aller Prädikate auf.
-
- Die Datenbank kann durch folgende Prädikate verändert werden:
-
- assert (F_TERM, AUFRUFLISTE, INTEGER)
- PAR_1 wird als der Kopf einer Klausel, PAR_2 als
- deren Rumpf betrachtet; diese Klausel wird direkt
- nach der n-ten Klausel der entsprechenden Prozedur
- in die Datenbank eingefügt ( n = PAR_3, falls die
- Klausel mit dieser Nummer existiert; n = Nummer der
- letzten Klausel, falls PAR_3 > Anzahl der Klauseln;
- falls keine Klauseln existieren, bzw. PAR_3 < 1,
- wird die neue Klausel als erste eingefügt).
-
- retract (NAME, INTEGER, INTEGER)
- PAR_2 darf nicht negativ sein. PAR_1 und PAR_2
- geben Namen und Stelligkeit eines Prädikates an;
- falls das entsprechende Prädikat keine Klausel mit
- der Nummer PAR_3 besitzt, schlägt 'retract' fehl;
- sonst wird die entsprechende Klausel aus der
- Datenbank entfernt, und 'retract' wird erfüllt.
- Achtung : Falls zum Zeitpunkt der Löschung noch
- Instanzen der gelöschten Klausel aktiv sind, werden
- in den allermeisten Fällen katastrophale Fehler
- auftreten !
-
- clause (NAME, INTEGER, INTEGER, TERM, TERM)
- PAR_2 darf nicht negativ sein. PAR_1 und PAR_2
- geben Namen und Stelligkeit eines Prädikates an;
- falls das entsprechende Prädikat keine Klausel mit
- der Nummer PAR_3 besitzt, schlägt 'clause' fehl;
- sonst wird versucht, PAR_4 mit deren Kopf und PAR_5
- mit deren Rumpf zu unifizieren.
-
-
- asserta (F_TERM)
- behandelt PAR_1 als eine Klausel; falls der
- äußerste Funktor ':-' ist, und das erste seiner
- Argumente kein F_TERM , wird ein Fehler erzeugt.
- Die Klausel wird als erste Klausel des
- entsprechenden Prädikates in die Datenbank
- eingefügt.
-
- assertz (F_TERM)
- wie 'asserta', aber die Klausel wird als letzte
- Klausel des entsprechenden Prädikates in die
- Datenbank eingefügt.
-
- assert (F_TERM)
- ein Synonym für 'asserta'.
-
- retract (F_TERM)
- behandelt PAR_1 als eine Klausel; falls deren
- äußerster Funktor ':- ist, und das erste seiner
- Argumente kein F_TERM, so wird ein Fehler erzeugt.
- Die erste Klausel, die mit PAR_1 unifiziert werden
- kann, wird aus der Datenbank entfernt (falls PAR_1
- die Form F_TERM :- VAR hat, kann es nur mit
- Klauseln unifiziert werden, deren Rumpf aus einem
- einzigen Variablenaufruf besteht !). Wenn 'retract'
- wiedererfüllt werden soll, wird die nächste mit
- PAR_1 unifizierbare Klausel entfernt, usw.
-
- clause (F_TERM, TERM)
- findet die erste Klausel, deren Kopf mit PAR_1 und
- deren Rumpf mit PAR_2 unifiziert werden kann. Wird
- nach erfolgreicher Unifikation erfüllt; soll
- 'clause' wiedererfüllt werden, so wird die nächste
- Klausel gesucht, usw.
-
- redefine
- wird für die Implementierung von 'reconsult'
- gebraucht (sollte nicht direkt aufgerufen werden).
- Zwischen zwei Aufrufen von 'redefine' verhält sich
- 'assert' anders als normal : wenn eine Klausel mit
- 'assert' gespeichert werden soll, die nicht zu dem
- zuletzt mit 'assert' gespeicherten Prädikat gehört,
- wird vorher das gesamte Prädikat gelöscht, zu dem
- die neue Klausel gehört.
-
- abolish (NAME, INTEGER)
- PAR_2 darf nicht negativ sein; das Prädikat mit
- Namen PAR_1 und Stelligkeit PAR_2 wird vollständig
- gelöscht.
-
-
- predefined (NAME, INTEGER)
- PAR_2 darf nicht neagtiv sein; 'predefined'
- überprüft, ob das Prädikat mit Namen PAR_1 und
- Stelligkeit PAR_2 eine Systemfunktion ist.
-
- consult (DATEINAME)
- schaltet den aktuellen Eingabestrom um und liest
- Klauseln, die danach mit 'assertz' gespeichert
- werden. Es gibt dabei zwei Ausnahmen : der Term
- 'end' beendet den Einlesemodus und stellt den alten
- Eingabestrom wieder her; Terme mit dem Funktor
- ':-'/1 werden als Kommandos betrachtet und sofort
- ausgeführt.
-
- reconsult (DATEINAME)
- wie 'consult', aber vor und nach dem Einlesen wird
- 'redefine' aufgerufen, so daß zusammenhängende
- Folgen von Klauseln eines Prädikates das alte
- Prädikat ersetzen, statt es zu ergänzen.
-
- consultall (TERM)
- PAR_1 muß eine Liste von DATEINAMEn oder Termen der
- Form '- DATEINAME' sein (auch gemischt); für jeden
- einfachen DATEINAMEN wird 'consult', für jeden
- DATEINAMEN mit '-'/1 wird 'reconsult' aufgerufen.
- Dieses Prädikat wird von der Benutzerschnittstelle
- aufgerufen, wenn eine Liste als Kommando eingegeben
- wurde.
-
- listing (F_TERM)
- PAR_1 muß ein ATOM, oder ein Term der Form
- ATOM/INTEGER, oder eine (eventuell verschachtelte)
- Liste solcher Terme sein; jedes ATOM wird als Name,
- jede Zahl als Stelligkeit eines Prädikates
- betrachtet. Alle Klauseln, die zu dem jeweiligen
- Prädikat gehören, werden auf den aktuellen
- Ausgabestrom ausgegeben.
-
- listing
- wie listing/1, aber es werden alle Prädikate,
- einschließlich der vordefinierten Prädikate,
- ausgegeben. Die Reihenfolge wird durch die 'hash'-
- Funktion des inneren Interpreters festgelegt
- und kann nicht geändert werden.
-
- proc (TERM)
- versucht, PAR_1 mit einem F_TERM zu unifizieren,
- der den Namen und die Stelligkeit des ersten
- Prädikates in der Datenbank besitzt; soll 'proc'
- wiedererfüllt werden, wird das jeweils nächste
- Prädikat benutzt; schlägt fehl, wenn kein solches
- Prädikat mehr da ist. Zur Reihenfolge der Prädikate
- siehe listing/0.
-
- III.2.9 Kontrolle des Programmablaufs
-
- Bezeichnungen :
- Wenn der Aufruf eines Prädikats eine Klausel aktiviert, die
- nicht die letzte ihres Prädikats ist, so wird dieser Kausel
- ein Zeiger in die Datenbank zugeordnet. Dieser Zeiger wird
- verwendet, wenn das aufgerufene Ziel wiedererfüllt werden
- muß.
- Die direkten Nachkommen eines Aufrufes A sind die Aufrufe in
- der durch A aktivierten Klausel. Der direkte Vorfahr von A
- ist der Aufruf, der die Klausel aktivierte, in der A
- vorkommt. Ein Vorfahr von A ist der direkte Vorfahr oder ein
- Vorfahr des direkten Vorfahrs; ein Nachkomme von A ist ein
- direkter Nachkomme oder einer von dessen Nachkommen.
-
- ! ('cut', manchmal auch 'slash')
- wird erfüllt, nachdem der nächste Vorfahr gefunden
- wurde, der nicht call/1, tag/1, ,/2 oder ;/2 ist.
- Alle Datenbankzeiger, die zu diesem Vorfahren und
- allen seinen Nachkommen gehören, werden entfernt.
-
- repeat
- wird erfüllt, und kann beliebig oft wiedererfüllt
- werden.
-
- call (AUFRUF)
- verhält sich so, als ob PAR_1 anstelle des Aufrufs
- von 'call' stünde; allerdings wird ein fehlerhafter
- Parameter bei Verwendung von 'call' erst zur
- Laufzeit des Programms erkannt. Im äußeren
- Interpreter kann eine Variable anstelle eines
- Prädikates als Aufruf in einer Klausel vorkommen;
- ein solcher Variablenaufruf wird vom äußeren
- Interpreter in einen Aufruf von 'call' umgewandelt.
-
- tag (AUFRUF)
- eine andere Form von call(AUFRUF); auf einen Aufruf
- von 'tag' kann mit den Prädikaten 'tagfail',
- 'tagexit', 'tagcut' und 'ancestor' zugegriffen
- werden. PAR_1 heißt markierter Vorfahr seiner
- Nachkommen.
- Ein Aufruf von 'tag' wird von 'tagfail' etc. nur
- dann erkannt, wenn er explizit in einer Klausel
- steht; z.B. wird call(tag(A)) nicht erkannt.
-
- ancestor (TERM)
- sucht nach dem nächsten markierten Vorfahren, der
- mit PAR_1 unifiziert werden kann; wird keiner
- gefunden, so schlägt 'ancestor' fehl, ansonsten
- werden der Vorfahr und PAR_1 unifiziert und
- 'ancestor' erfüllt.
-
-
- tagcut (TERM)
- wie 'ancestor', aber bei Erfolg werden sämtliche zu
- dem gefundenen Vorfahren und seinen Nachkommen
- gehörenden Datenbankzeiger entfernt.
-
- tagfail (TERM)
- sucht nach dem nächsten mit PAR_1 unifizierbaren
- markierten Vorfahren; schlägt fehl, falls keiner
- gefunden wird. Wird ein markierter Vorfahr
- gefunden, so schlägt dieser sofort fehl.
-
- tagexit (TERM)
- sucht nach dem nächsten mit PAR_1 unifizierbaren
- markierten Vorfahren; schlägt fehl, falls keiner
- gefunden wird. Wird ein markierter Vorfahr
- gefunden, so wird er mit PAR_1 unifiziert und
- sofort erfüllt (d.h. der Aufruf nach tag(...) wird
- als nächstes betrachtet).
-
- halt (ATOM)
- gibt ATOM aus und beendet den inneren Interpreter.
-
- stop
- beendet die Hauptschleife des äußeren Interpreters;
- im Normalfall wird 'halt' aufgerufen und auch der
- innere Interpreter beendet. Ausnahmen sind möglich
- (z.B. im Editor).
-
- sysload (DATEINAME)
- beendet den äußeren Interpreter und schaltet den
- aktuellen Eingabestrom auf die angegebene Datei um.
- Diese Datei sollte ein Programm in der Syntax des
- inneren Interpreters enthalten (siehe Anhang).
- Nach einem 'seen', bzw. bei Erreichen des
- Dateiendes, wird der äußere Interpreter wieder
- gestartet.
-
-
- III.2.10 Hilfsmittel zum Testen von Programmen
-
- In der ST-Version von TOY Prolog gibt es die Möglichkeit, den
- Ablauf eines Programms durch Drücken der Tastenkombination
-
- 'Shift' 'Alternate' 'Help'
-
- zu unterbrechen. Das momentane Ziel wird in der Form
-
- INTR: .......
-
- ausgegeben, und der Benutzer erhält die Möglichkeit, den
- Programmablauf zu verändern. Dazu kann er folgende Optionen
- wählen:
- A (Abort) Das gesamte zu erfüllende Ziel wird
- abgebrochen (einschließlich des äußeren
- Interpreters).
- B (Backtrace) Die Vorfahren des momentanen Zieles werden
- angezeigt.
- C (Continue) Das momentane Ziel wird bearbeitet.
- D (Debug ON/OFF) Der Testmodus wird ein- oder ausgeschaltet
- (siehe 'debug').
- F (Fail) Das momentane Ziel schlägt fehl.
- S (Step ON/OFF) Der Einzelschrittmodus wird ein- oder
- ausgeschaltet; ist er eingeschaltet, so wird
- das Programm vor der Bearbeitung des nächsten
- Zieles von selbst wieder unterbrochen.
-
- Es existieren außerdem einige Prädikate, die den Programmtest
- erleichtern sollen:
-
- interrupt
- untebricht den Programmablauf (als hätte der
- Benutzer die Taste 'Help' gedrückt).
-
- debug
- schaltet den Testmodus ein. Im Testmodus wird jedes
- zu bearbeitende Ziel mit einer Information
- ausgegeben, die anzeigt, ob das Ziel
- - das erste Mal aufgerufen wird (CALL: ...)
- - wiedererfüllt werden soll (REDO: ...)
- - erfolgreich beendet wird (EXIT: ...)
- - oder fehlschlägt (FAIL: ...).
-
- nodebug
- schaltet den Testmodus aus.
-
-
- nonexistent
- schaltet die Überwachung der Aufrufe von
- undefinierten Prädikaten ein. Nach 'nonexistent'
- wird beim Aufruf eines undefinierten Prädikates
- eine Meldung ausgegeben.
-
- nononexistent
- schaltet diese Meldungen wieder aus.
-
- Die folgenden beiden Prädikate schalten den Testmodus selektiv für
- bestimmte Aufrufe ein:
-
- spy (NAME, INTEGER)
- PAR_2 darf nicht negativ sein; der Testmodus wird
- für das Prädikat mit dem Namen PAR_1 und der
- Stelligkeit PAR_2 eingeschaltet.
-
- spy (NAME, VAR)
- dito, aber für alle Prädikate mit diesem Namen; die
- Variable wird nicht instantiiert.
-
- spy (VAR, INTEGER)
- dito, aber für alle Prädikate mit gegebener
- Stelligkeit.
-
- spy (VAR, VAR)
- dito, aber für alle Prädikate. Der Effekt ist der
- gleiche wie bei 'debug', kann aber nicht mit
- 'nodebug' wieder abgeschaltet werden (!). Da die
- Variablen nicht instantiiert werden, kann man
- zweimal dieselbe Variable verwenden.
-
- nospy (PAR1, PAR2)
- schaltet den Testmodus selektiv wieder ab. Alle
- Aufrufmuster von 'spy' können in der gleichen Weise
- wie dort verwendet werden. 'nospy' kann den mit
- 'debug' eingeschalteten allgemeinen Testmodus nicht
- ausschalten.
-
- spied (NAME, INTEGER)
- überprüft, ob der selektive Testmodus für das
- Prädikat mit Namen PAR_1 und Stelligkeit PAR_2
- eingeschaltet ist.
-
-
- III.2.11 Verarbeitung von grammatikalischen Regeln
-
- phrase (AUFRUF, TERM)
- behandelt PAR_1 als nicht-terminales Symbol einer
- grammatikalischen Regel und veranlaßt die
- Verarbeitung von PAR_2, wobei PAR_1 als Startsymbol
- verwendet wird.
-
-
- III.2.12 Verschiedene Funktionen
-
- length (F_TERM, TERM)
- PAR_1 muß eine 'geschlossene' Liste sein, deren
- Länge berechnet wird. Es wird versucht, das
- Ergebnis mit PAR_2 zu unifizieren.
-
- isclosedlist (TERM)
- überprüft, ob PAR_1 eine 'geschlossene' Liste ist.
-
- numbervars (TERM)
- instantiiert die Variablen, die in PAR_1 vorkommen,
- mit 'V'(1), 'V'(2), ... . Variablen, die aneinander
- gebunden sind, werden mit dem selben 'V'(n)
- instantiiert.
-
- member (TERM, TERM)
- überprüft, ob PAR_1 ein Element der Liste PAR_2
- ist. Falls PAR_2 eine 'offene' Liste ist, die PAR_1
- nicht enthält, so wird 'member' erfüllt, nachdem
- die Liste um PAR_1 erweitert wurde.
-
- bagof (TERM, AUFRUF, TERM)
- versucht, PAR_3 mit einer Liste der für PAR_1 -
- nach allen möglichen Berechnungen von PAR_2 -
- ermittelten Instantiierungen zu unifizieren.
-
- status
- gibt eine Übersicht über die momentane
- Speicherbelegung.
-
- Die folgenden Prädikate benutzen die Uhr des ATARI ST:
-
- date (VARINT, VARINT, VARINT)
- versucht, PAR_1, PAR_2 und PAR_3 mit Zahlen zu
- unifizieren, die das Datum in der Form "Tag, Monat,
- Jahr" angeben.
-
- set_date (INTEGER, INTEGER, INTEGER)
- setzt das Datum fest : Par_1 - Tag, PAR_2 - Monat,
- PAR_3 - Jahr.
-
- time (VARINT, VARINT, VARINT)
- versucht, PAR_1, PAR_2 und PAR_3 mit Zahlen zu
- unifizieren, die die Tageszeit in der Form "Stunde,
- Minute, Sekunde" angeben.
-
- set_time (INTEGER, INTEGER, INTEGER)
- stellt die Uhr (PAR_1 Stunde, PAR_2 Minute, PAR_3
- Sekunde).
-
- 'time' und 'set_time' arbeiten mit Einheiten von 2 Sekunden.
-
-
- translate (DATEINAME, DATEINAME)
- schaltet die Eingabe auf PAR_1 und die Ausgabe auf
- PAR_2 um und übersetzt das von PAR_1 gelesene
- Programm in die Syntax des inneren Interpreters.
- Das Ergebnis ist eine Datei, die mit 'sysload'
- eingelesen werden kann.
- Siehe auch die Abschnitte über 'consult',
- 'sysload', sowie den Anhang.
-
- III.3 Die GEM-Funktionen
-
- TOY Prolog ST kann auf einige der Funktionen von VDI und AES
- zugreifen. Genaueres zu diesen Funktionen kann hier nicht
- angegeben werden.
-
- In den folgenden Kurzbeschreibungen sind alle Parameter, soweit
- nicht anders angegeben, INTEGER-Zahlen.
-
- III.3.1 Kontrollfunktionen
-
- grf_clip (Flag, X1, Y1, X2, Y2)
- Falls Flag = 0, wird das Clipping ausgeschaltet,
- sonst eingeschaltet; (X1, Y1) und (X2, Y2) sind
- diagonal gegenüberliegende Ecken des Clipping-
- Rechtecks.
-
- grf_wrmode (Modus)
- Stellt den Schreibmodus ein :
- 0 - Replace - Modus
- 1 - Transparent-Modus
- 2 - XOR - Modus
- 3 - Reverse-Transparent-Modus
-
- grf_colour (Index, Rot, Grün Blau)
- Setzt die Farbzusammensetzung für die Farbe mit der
- Nummer Index fest. Rot, Grün und Blau liegen im
- Bereich 1 - 1000.
-
- grf_mode
- Schaltet den Grafikmodus ein.
-
- txt_mode
- Schaltet den Textmodus ein.
-
-
- III.3.2 Graphische Ausgabe
-
- grf_pline (Koordinatenliste)
- PAR_1 muß eine Liste mit einer geraden Anzahl von
- INTEGERs sein. Je zwei der Listenelemente werden
- als Koordinaten betrachtet; es wird ein Polygonzug
- (Polyline) gezeichnet.
-
- grf_pmarker (Koordinatenliste)
- Es wird eine Anzahl von Markierungen mit den durch
- PAR_1 angegebenen Koordinaten gezeichnet.
-
- grf_poly (Koordinatenliste)
- Es wird ein ausgefülltes Polygon gezeichnet.
-
- grf_fill (X, Y, Index)
- Eine Fläche wird bis zu ihrem Rand ausgefüllt,
- ausgehend vom Punkt (X, Y). Index ist der
- ursprüngliche Farbindex der Fläche.
-
- grf_box (X1, Y1, X2, Y2)
- Es wird ein ausgefülltes Rechteck gezeichnet;
- (X1, Y1) und (X2, Y2) sind gegenüberliegende Ecken.
-
- grf_bar (X1, Y1, X2, Y2)
- dito, aber das Rechteck wird umrandet.
-
- grf_arc (X, Y, R, Alpha, Omega)
- Ein Kreisbogen mit Mittelpunkt (X, Y), Radius R,
- Startwinkel Alpha und Endwinkel Omega wird
- gezeichnet.
-
- grf_pie (X, Y, R, Alpha, Omega)
- dito, aber ausgefüllter Kreissektor.
-
- grf_circle (X, Y, R)
- Ein ausgefüllter Kreis mit Mittelpunkt (X, Y) und
- Radius R wird gezeichnet.
-
- grf_ellipse (X, Y, Xrad, Yrad)
- Eine ausgefüllte Ellipse mit Mittelpunkt (X, Y) und
- Achsenabschnitten Xrad und Yrad wird gezeichnet.
-
- grf_rbox (X1, Y1, X2, Y2)
- Zeichnet ein nicht ausgefülltes Rechteck mit
- abgerundeten Ecken.
-
- grf_rfbox (X1, Y1, X2, Y2)
- Wie 'grf_rbox', aber ausgefülltes Rechteck.
-
- grf_text (X, Y, Text)
- Text ist ein NAME, der an der Position (X, Y) als
- Grafiktext ausgegeben wird.
-
- III.3.3 Attribute-Funktionen
-
- grf_l_colour (Index)
- Setzt die Linienfarbe fest.
-
- grf_l_type (Style)
- Setzt den Linientyp fest :
- 1 : durchgezogen
- 2 - 6 : gestrichelt
- 7 : frei definierbar
-
- grf_l_udstyle (Pattern)
- Setzt den frei definierbaren Linientyp fest.
- Pattern ist eine INTEGER-Zahl, deren 16 Bits das
- Muster festlegen.
-
- grf_l_width (Width)
- Setzt die Linienbreite fest.
-
- grf_l_ends (Begin, End)
- Setzt das Aussehen von Linienanfang (Begin) und
- -ende (End) fest.
- 0 : kantig
- 1 : Pfeil
- 2 : abgerundet
-
- grf_m_colour (Index)
- Setzt die Farbe der Markierungen fest.
-
- grf_m_type (Type)
- Setzt den Markierungstyp fest.
- 1 : Punkt
- 2 : Kreuz
- 3 : Stern
- 4 : Quadrat
- 5 : Diagonalkreuz
- 6 : Raute
-
- grf_m_height (Height)
- Setzt die Markierungsgröße fest.
-
-
- grf_t_height (Height)
- Setzt die Textgröße fest.
-
- grf_t_point (Point)
- Setzt die Textgröße in Punkt fest.
-
- grf_t_rotation (Angle)
- Setzt den Winkel fest, um den die Textgrundlinie
- gedreht wird.
-
- grf_t_colour (Index)
- Setzt die Textfarbe fest.
-
- grf_t_effects (Effects)
- Setzt die Texteffekte fest. Effects entsteht als
- Summe der gewünschten Effekte :
- 1 : Fettdruck
- 2 : Helle Schrift
- 4 : Kursivschrift
- 8 : Unterstreichung
- 16 : Außenrand der Buchstaben
-
- grf_t_align (Hor, Vert)
- Setzt die Textausrichtung fest.
- Hor : horizontale Ausrichtung -
- 0 : links
- 1 : zentriert
- 2 : rechts
- Vert : vertikale Ausrichtung -
- 0 : Grundlinie
- 1 : Obergrenze Kleinbuchstaben
- 2 : Obergrenze Zeichen
- 3 : Untergrenze Zeichenbox
- 4 : Untergrenze Unterlängen
- 5 : Obergrenze Zeichenbox
-
- grf_f_colour (Index)
- Setzt die Füllfarbe fest.
-
- grf_f_type (Interior)
- Setzt den Fülltyp fest :
- 0 : leer
- 1 : voll
- 2 : gemustert
- 3 : schraffiert
- 4 : frei definierbar
-
- grf_f_style (Style)
- Setzt für die Fülltypen 2 und 3 den Füllstil fest.
-
-
- grf_f_perim (Flag)
- Schaltet die Umrandung von ausgefüllten Flächen an
- (Flag = 1) oder aus (Flag = 0).
-
- grf_f_udpat (Pattern)
- Pattern muß eine Liste mit genau 16 INTEGER-Zahlen
- sein. Die 16 Zahlen werden als Muster für den
- Fülltyp 4 verwendet.
-
-
- III.3.4 Funktionen zur Maussteuerung
-
- grf_mse_hide
- Schaltet die Maus (den Grafikcursor) aus.
-
- grf_mse_show (Flag)
- Ist Flag = 0, so wird die Maus sofort wieder
- eingeschaltet; ansonsten wird sie erst dann wieder
- eingeschaltet, wenn 'grf_mse_show' genauso oft
- aufgerufen wurde wie vorher 'grf_mse_hide'.
-
- grf_mse_form (Form)
- Schaltet eine vordefinierte Mausform ein.
- 0 : Pfeil
- 1 : 'Cursor'
- 2 : Biene
- 3 : zeigende Hand
- 4 : flache Hand
- 5 : dünnes Kreuz
- 6 : dickes Kreuz
- 7 : Umrißkreuz
- 255 : Bleistift
-
- grf_mse_form (Xhot, Yhot, Mask, Data, Pattern)
- Schaltet eine frei definierte Mausform ein :
- Xhot und Yhot sind die Koordinaten des
- Aktionspunktes innerhalb des 16x16-Rasters, Mask
- und Data sind die Hinter- bzw. Vordergrundfarbe.
- Pattern muß eine aus genau 32 INTEGER-Zahlen
- bestehende Liste sein; die ersten 16 davon geben
- die Maske, die letzten 16 die Daten für das Raster
- an.
-
- grf_mse_state (Button, X, Y)
- Die Parameter müssen Variablen oder INTEGER-Zahlen
- sein; es wird versucht, Button mit dem momentanen
- Zustand der Maustasten und X bzw. Y mit der
- momentanen Position des Grafikcursors zu
- unifizieren.
-
-
- III.3.5 Darstellen einer Warnmeldung
-
- alert (Defbutton, Alert, Exbutton)
- Alert muß ein NAME sein; die Zeichen des Namens
- werden als Zeichenkette betrachtet.
- Die AES-Funktion 'form_alert' wird aufgerufen; es
- wird versucht, den Wert, den sie zurückliefert, mit
- Exbutton zu unifizieren.
- Exbutton muß eine Integer-Zahl oder eine Variable
- sein.
-
-
- III.4 Namen der Systemfunktionen
-
- Die Namen der Systemfunktionen können geändert werden, indem man
- die Beschreibungen im zweiten Abschnitt der Systemdatei ändert
- (siehe Anhang). Dabei ist darauf zu achten, daß weder die
- Reihenfolge noch die Anzahl der Namen geändert wird, und daß die
- Stelligkeiten erhalten bleiben.
-
- Es empfiehlt sich, vor einer Änderung eine neue Version der
- Benutzerschnittstelle herzustellen, da nach einer Änderung die
- vorherige Version wahrscheinlich nicht mehr lauffähig ist. Das
- Gleiche gilt für alle anderen Programme.
-
- Die Namen der vordefinierten Prädikate können nur geändert werden,
- indem deren Definition in der Systemdatei, bzw. (bei Prädikaten,
- die zur Benutzerschnittstelle gehören) im Quelltext geändert
- werden. Auch hierfür gelten die obigen Hinweise.
-
-
- IV. Die Hilfsprogramme von TOY Prolog
-
- IV.1 Der Übersetzer für die Benutzerschnittstelle
-
- Quellcode und Zwischencode : 'BOOTER.TOY'.
-
- Das Programm 'BOOTER.TOY' wird benötigt, um nach Änderungen der
- Benutzerschnittstelle eine neue Version der Systemdatei
- herzustellen. Die Benutzerschnittstelle ist nicht im vollständigen
- Prolog geschrieben, sondern in einer 'abgemagerten' Version, die
- sich leicht in die Syntax des inneren Interpreters übersetzen
- läßt. Der Übersetzer erledigt genau diese Arbeit.
-
- Benutzung des Übersetzers
-
- Um eine neue Version der Benutzerschnittstelle zu übersetzen, wird
- der Übersetzer mit 'sysload' geladen.
- Der Aufruf erfolgt in der Form
-
- transl(Eingabedatei, Ausgabedatei).
-
- also analog zum vordefinierten Prädikat 'translate'.
- Als Zeichen für das Ende der Eingabedatei dient das Zeichen '#';
- falls es nicht am Ende der Eingabedatei steht, muß es von Hand
- eingegeben werden.
-
- Der Übersetzer kann Fehlermeldungen produzieren; dabei gibt er
- den Namen desjenigen Prädikats aus, das den Fehler entdeckt hat,
- sowie das fehlerhafte Zeichen und den Rest der Eingabe bis zum
- nächsten Punkt.
-
- Ist die Übersetzung fehlerfrei verlaufen, so enthält die
- Ausgabedatei den Zwischencode der neuen Version der
- Benutzerschnittstelle; dieser Code kann - am besten nach Entfernen
- der Kommentare - mit einem Texteditor anstelle des alten
- Zwischencodes in die Systemdatei eingefügt werden. Es ist ratsam,
- vorher eine Kopie der alten (lauffähigen !) Benutzerschnittstelle
- zu machen, da es durchaus vorkommen kann, daß die neue Version
- fehlerhaft ist. Beliebte Fehler sind das Verwechseln von Groß- und
- Kleinschreibung, insbesondere bei Variablennamen wie z.B.
-
- NextCh - Nextch - NextChar - NextChr etc.
-
-
- IV.2 Der Editor
-
- Quelltext : 'EDITOR'.
- Zwischencode : 'EDITOR.TOY'.
-
- Es handelt sich um einen einfachen Editor für Prädikate.
- Er wird mit
-
- edit (Name/Stelligkeit).
-
- aufgerufen. Der Editor zeigt jeweils die momentane Klausel
- zusammen mit ihrer Nummer an; am Anfang steht er auf Klausel 0,
- d.h. vor der ersten Klausel. Nach jedem Kommando wird die (neue)
- Klausel angezeigt.
-
-
- Der Editor versteht folgende Kommandos :
-
- e Name/Stelligkeit ruft eine neue Inkarnation des Editors auf. Es
- kann ein anderes Prädikat bearbeitet werden.
- x verläßt die momentane Inkarnation des Editors.
- + zeigt die nächste Klausel an, falls es eine
- gibt.
- <CR> (Leerzeile) wie +
- - zeigt die vorherige Klausel an (falls es eine
- gibt).
- t geht zur Klausel 0.
- b geht zur letzten Klausel.
- l listet das gesamte Prädikat auf.
- d löscht die momentane Klausel und geht zur
- nächsten (oder zur letzten, falls die vorher
- letzte gelöscht wurde).
- i In den folgenden Zeilen eingegebene Klauseln
- werden nach der momentanen Klausel eingefügt;
- 'end.' beendet den Einfügemodus.
- f Dateiname Wie 'i', aber die Klauseln werden aus der
- angegebenen Datei gelesen.
- p ruft eine neue Inkarnation von Prolog auf (!).
- Wenn 'stop' ausgeführt wird, wird im Editor
- fortgefahren. In der verschachtelten
- Inkarnation von Prolog sollte 'sysload' nicht
- benutzt werden.
-
- Ein eingegebenes Kommando muß nach dem letzten Zeichen beendet
- werden. Wo Leerzeichen angegeben sind, muß genau eines eingegeben
- werden.
-
-
- IV.3 Der Programmanalysator
-
- Quelltext : 'CALLTREE'
- Zwischencode : 'CALLTREE.TOY'
-
- Der Programmstrukturanalysator wird mit
-
- calltree (Name/Stelligkeit).
-
- aufgerufen, um das Prädikat mit dem angegebenen Namen und der
- angegebenen Stelligkeit zu analysieren. Er erzeugt eine Liste der
- Aufrufe, die während des Programmablaufs als Teilziele betrachtet
- werden.
- Teilziele werden in der Zeile, in der sie erstmals vorkommen, mit
- einer Nummer versehen, auf die bei nochmaligem Auftreten verwiesen
- wird.
- Die Verschachtelungstiefe wird durch verschieden weite Einrückung
- der Zeilen angezeigt.
-
- Der Programmstrukturanalysator sollte nicht mit 'Help'
- unterbrochen werden und nicht im Testmodus laufen, da während des
- Programmablaufs in den meisten Fällen zyklische Datenstrukturen
- erzeugt werden. Solche Datenstrukturen entstehen z.B. auch, wenn
- die Terme
-
- X und f(X)
-
- unifiziert werden. Wie man sieht, enthält TOY Prolog keinen 'occur
- check' : Die Terme werden ohne weiteres unifiziert. Jeder Versuch,
- den enstehenden Term auszugeben, führt allerdings in eine endlose
- Ausgabeschleife, die zum Absturz des Interpreters führt. Im
- Programmanalysator werden solche Strukturen erzeugt, wenn
- rekursive Prädikate analysiert werden.
-
-
- V. Die Demonstrationsprogramme
-
- V.1 ALPHA
-
- Quellcode : 'ALPHA'
-
- ALPHA ist ein Beispiel für die Entwicklung von interaktiven
- Programmen. Nach dem Einlesen wird es mit 'go.' aufgerufen.
- ALPHA versteht drei Formen von Sätzen. Nachstehend ein
- beispielhafter Dialog (Ausgaben unterstrichen) :
-
- go.
- (...)
- John is a man.
- OK
- A man is a person.
- OK
- Is John a person ?
- Yes.
- Is Mary a person ?
- I don't know !
- Bye.
- (...)
-
- ALPHA liest die Sätze mit einem Prädikat ein, das einzelne Zeichen
- liest und sie zu Worten zusammenfaßt. Die dabei entstehende Liste
- von Worten wird danach mit Hilfe von grammatischen Regeln
- untersucht und in Prolog-Anweisungen übersetzt. Die obigen
- Eingaben führen z.B. dazu, daß folgende Klauseln in die Datenbank
- übernommen werden :
-
- man(john).
- person(X) :- man(X).
-
- V.2 TOYSEQUEL (© 1983 Kluzniak & Szpakowicz)
-
- Quelltext : 'TOYSEQ'
-
- TOYSEQUEL ist ein erheblich größeres Beispiel für die Benutzung
- von grammatikalischen Regeln zur Implementierung einer
- Kommandosprache. TOYSEQUEL stellt eine relationale Datenbank dar.
- Eine genaue Beschreibung der Kommandos findet sich in "Prolog for
- Programmers".
-
-
- Hier kann nur auf die Grundlagen eingegangen werden, und zwar
- anhand von Beispielen :
-
- Aufruf von TOYSEQUEL
-
- :- toysequel.
-
- Es werden einige Relationen erzeugt
-
- create ANG < string name, integer gehalt, integer abtnr >.
- create ABT < integer abtnr, string manager >.
- create Aufsichtsrat < string name, integer funktion >.
-
- Einfügen von Datentupeln
-
- into ANG insert <"Schmidt", 1000, 1>, <"Meier", 1200, 2>,
- <"Müller", 600, 1>.
- into ABT insert <1, "Raffke">, <2, "Hoffmann">.
-
- Anfragen über Relationen
-
- relations.
- Aufsichtsrat
- ABT
- ANG
-
- relation ANG.
- string name
- integer gehalt
- integer abtnr
-
- Betrachten von Tupeln mit bestimmten Eigenschaften
-
- select from ANG tuples <name, gehalt> where abtnr = 1.
- Schmidt 1000
- Müller 600
-
- Einfügen von ausgewählten Tupeln
-
- into ANG insert select from ABT tuples <manager, 1000, abtnr>.
-
- Verändern von Tupeln
-
- update ANG so that gehalt = 1200 where name = "Raffke".
-
- from ANG delete tuples where name = "Hoffmann".
-
-
- Die Möglichkeiten des Programms gehen noch erheblich weiter; es
- gibt verschiedene Möglichkeiten des Vergleichs, beliebig
- komplizierte arithmetische Ausdrücke; kommt ein Name in mehreren
- Relationen vor, so kann er durch Qualifizieren eindeutig bestimmt
- werden; eine Relation, die in einem Kommando mehrfach gebraucht
- wird, kann 'Alias'-Namen erhalten etc.
-
- Noch drei wichtige Kommandos :
-
- dump to DATEINAME.
- speichert die Relationen in der angegebenen Datei.
-
- load from DATEINAME.
- lädt eine Datei.
-
- stop.
- kehrt zurück zu TOY Prolog.
-
-
- V.3 Tic Tac Toe
-
- Quelltext : 'TICTAC.TOE'
- Zwischencode : 'TICTAC.TOY'
-
- Tic Tac Toe soll die Verwendung der Grafikfunktionen von TOY
- Prolog ST anhand eines Bei - Spiels demonstrieren.
-
- Der Aufruf erfolgt durch
-
- tictactoe.
-
- Der Benutzer spielt gegen den Computer (das Programm ist etwas
- langweilig, da der Computer nicht verlieren kann).
- Ein Zug wird ausgeführt, indem der Benutzer mit dem Mauszeiger auf
- ein freies Feld des Spielbrettes zeigt und den linken Mausknopf
- drückt.
- Wird der Mausknopf gedrückt, während der Zeiger auf den 'STOP'-
- Knopf zeigt, so wird das Programm beendet.
-
-
-
- Ende der allgemeinen Dokumemtation zu TOY Prolog ST, Version 3.
-
-
-